FireLensコンテナのログをCloudWatch Logsへ保存したときのログストリームの名は。
ECSのタスク(コンテナ)のログ出力先を変更できるFireLens機能があります。アプリケーションコンテナのログルーティングはFireLensで起動するFluent Bitか、Fluendの機能を利用して実現しています。FireLensコンテナ自身のログはFireLensのトラブルシュート、デバッグ用にFluent Bitか、Fluentdを経由せずにCloudWatch Logsへ直接保存できます。
-
Icons made by Freepik from www.flaticon.com
スケールアウト・インしてタスク(コンテナ)が増減したとき、サイドカーとして起動しているFireLensのログはCloudWatch Logsへどのように保存されているのか気になったので検証しました。
-
Icons made by Freepik from www.flaticon.com
まとめ
- ECSのタスク毎にログストリームが作成され、FireLensコンテナ毎に分かれてログが保存される
- スケールアウトして4個タスクが起動すればCloudWatch Logsの単一のロググループ内に4個のログストリームが新規追加される
検証環境
項目 | バージョン |
---|---|
aws-for-fluent-bit | 2.19.0 |
Fluent Bit | 1.8.3 |
Fargate platform | 1.4.0 |
以下のリンクの構成にECSサービスのAuto Scaling設定を追加した検証環境を構築しました。
FireLensのログとは
FireLensコンテナ自身のログです。FireLensコンテナの起動時のログや、Fluent Bitの設定ファイルにエラーがあり、FireLensコンテナ起動できなかったときのエラーメッセージを確認できたりします。
正常起動時
エラーの時
FireLensコンテナの設定
タスク定義でFireLensコンテナのログ設定はlogDriver
をawslogsに指定し、直接CloudWatch Logsへログを送信します。CloudWatch Lgosのロググループ名はawslogs-group
で/ecs/logs/sample-dev-firelens-logrouterと指定しました。
"logConfiguration": { "logDriver": "awslogs", "secretOptions": [], "options": { "awslogs-group": "/ecs/logs/sample-dev-firelens-logrouter", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "firelens" } },
このタスク定義を持つFargateのクラスター、サービスと、CloudWatch Logsを確認していきます。
FireLensのログを確認する
CloudWatch Logsのロググループはタスク定義で指定した通りの名前で作成されています。
早速ですがアプリケーションコンテナに負荷をかけてスケールアウトさせました。タスクが増えていっています。タスク単位でFireLensも起動するため、現状ですと4個のFireLensコンテナがサイドカーとして起動することになります。
ロググループの中を確認します。謎の英数字の羅列の4個のログストリーム名が作成されています。
謎の英数字の羅列はタスク名でした。タスク名ごとにログストリームが作成されています。すなわちタスク単位で個別にFireLensコンテナのログを確認できます。左側がECSの画面、右側がCloudWatchの画面です。
ログストリーム1個を開き、FireLensのログを確認します。最新のログはスケールインしてコンテナが落ちる前までのログが保存されていました。。Fluent Bitの設定ファイルでGrace 30
の設定により30秒待機してから停止していることが確認できます。
FireLensで起動するFluent Bitに以下の設定を追加しています。
[SERVICE] Flush 1 Grace 30 [FILTER] Name grep Match webapp-firelens* Exclude log ^(?=.*ELB-HealthChecker\/2\.0).*$ [OUTPUT] Name cloudwatch_logs Match webapp-firelens* region ap-northeast-1 log_group_name /ecs/logs/sample-dev/application log_stream_name webapp auto_create_group true
スケールインしてタスク(FireLensコンテナ)が終了しても、CloudWatch Logへログを保存しているため後からでもログを確認できました。
おわりに
タスク定義でawslogsと、ロググループ名の指定しかしていません。よしなにログストリーム名には自動的にタスク名をつけて作成し、FireLensのコンテナ個別にログ分けて保存してくれていました。
CloudWatch Logsへログを送る(PutLogsEvents)の送信数のクォータはログストリーム単位です。単一のログストリームに大量にログ送信が発生すると制限に引っかかる可能性もあるため、個別のログストリームが作成される方が理にかなっているのかもしれません。